package com.hong.arithmetic.caffeine;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.RemovalListener;

import java.util.concurrent.TimeUnit;

/**
 * @author: csh
 * @Date: 2020/11/1 17:28
 * @Description:
 */
public class CaffeineStudy {

    /**
     *
     * 功能描述:咖啡因测试
     * 功能说明：
     * initialCapacity: 初始的缓存空间大小
     * maximumSize: 缓存的最大数量
     * maximumWeight: 缓存的最大权重
     * expireAfterAccess: 最后一次读或写操作后经过指定时间过期
     * expireAfterWrite: 最后一次写操作后经过指定时间过期
     * refreshAfterWrite: 创建缓存或者最近一次更新缓存后经过指定时间间隔，刷新缓存
     * weakKeys: 打开key的弱引用
     * weakValues：打开value的弱引用
     * softValues：打开value的软引用
     * recordStats：开发统计功能
     *
     * 注意：
     * expireAfterWrite和expireAfterAccess同时存在时，以expireAfterWrite为准。maximumSize和maximumWeight不可以同时使用。
     *
     * @param:
     * @return:
     * @auther: csh
     * @date: 2020/11/1 17:32
     */
    public static void main(String[] args) throws InterruptedException {
        Cache<String, String> cache = Caffeine.newBuilder()
                //初始化大小
                .initialCapacity(100)
                // 数量上限
                .maximumSize(1024)
                // 过期机制 5秒钟
                .expireAfterWrite(5, TimeUnit.SECONDS)
                // 弱引用key
                .weakKeys()
                // 弱引用value
                .weakValues()
                // 剔除监听
                .removalListener((RemovalListener<String, String>) (key, value, cause) ->
                        System.out.println("key:" + key + ", value:" + value + ", 删除原因:" + cause.toString()))
                .build();
        // 将数据放入本地缓存中
        cache.put("username", "hong");
        cache.put("password", "123456");
        // 从本地缓存中取出数据
        System.out.println(cache.getIfPresent("username"));
        System.out.println(cache.getIfPresent("password"));
        //清空
        //cache.cleanUp();
        //删除 促发监听
        cache.invalidate("username");
        //批量删除
        cache.invalidateAll();
        //过期尝试
        Thread.sleep(5001);
        System.out.println("5秒后获取：");
        System.out.println(cache.getIfPresent("username"));
        System.out.println(cache.getIfPresent("password"));
    }
}
